#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <pthread.h>
#include <string>

int g_val = 100;

// 可以被多个执行流同时执行, show函数被重入了哦！
void show(const std::string &name)
{
    std::cout << name << "say# " << "hello thread" << std::endl;
}

void *pthreadRoutine(void *args)
{
    const char *name = (char *)args;
    int cnt = 5;
    while (cnt)
    {
        // printf("new thread : "
        //        "g_val : %d, &g_val : 0x%p\n",
        //        g_val, &g_val);
        // std::cout << name << " : " << getpid() << std::endl;
        // show("[new thread]");
        sleep(1);
        cnt--;
    }

    // int a=10;
    // int b=0;
    // int c=a/b;

    pthread_exit((void *)100); // 线程退出
    // exit(11);  //适用于进程的退出 不是线程的退出
    // return nullptr; // 新线程默认退出
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, pthreadRoutine, (void *)"Thread 1");

    sleep(1);            // 只是为了保证新线程已经启动
    pthread_cancel(tid); // 不常见 返回值PTHREAD_CANCELED是一个很大的数字

    // sleep(1);
    // return 0;

    // while (true)
    // {
    //     // printf("main thread : "
    //     //        "g_val : %d, &g_val : %p\n",
    //     //        g_val, &g_val);
    //     // g_val++;
    //     // std::cout << "main thread : " << getpid() << std::endl;
    //     // show("[main thread]");
    //     sleep(1);
    // }

    // 回收新线程
    void *ret;
    pthread_join(tid, &ret);

    std::cout << "main thread quit..." << (long long int)ret << std::endl; // main thread等待的时候，默认是阻塞等待的！为什么我们在这里join的时候不考虑异常呢？？做不到！

    return 0;
}